package module.login;

import bean.*;
import dao.AdminDao;
import dao.RefereeDao;
import dao.impl.AdminDaoImpl;
import dao.impl.AthleteDaoImpl;
import dao.impl.RefereeDaoImpl;
import dao.impl.UserDaoImpl;
import module.admin.AdminView;
import module.ahleteView.AthleteView;
import test.MouseEventDemo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.UUID;

/**
 * @Author leiHua
 * @Date 2022/5/8 00:32
 */

public class LoginView implements ActionListener {
    /*
     * 登录界面
     */
    private JComboBox<String> jcomboBox = new JComboBox<String>();
    private JTextField textName = new JTextField();
    private JPasswordField textPass = new JPasswordField();
    JButton jb1 = new JButton("登录");
    JButton jb2 = new JButton("注册");
    JFrame jf = new JFrame();// 创建一个窗口

    public LoginView() {
        //设置gui样式
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        JPanel contentPane = (JPanel) jf.getContentPane();
        contentPane.setOpaque(false);
        jf.setTitle("广软运动会");// 设置窗口标题
        //窗口居中
        jf.setBounds((Constant.SCREEN_WIDETH - 825) / 2, (Constant.SCREEN_HEIGHT - 600) / 2, 825, 600);
        jf.setLayout(null);// 布局为空  即流式布局
        contentPane.setLayout(null);

        /**
         *  放置背景图片
         */
        ImageIcon img = new ImageIcon
                ("F:\\MyCode\\java\\javaSE\\leihua\\src\\imag\\1.jpg");
        JLabel background = new JLabel(img);
        jf.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));  //分层容器中的最小值（最底层）
        background.setBounds(0, 0, 825, 600);


        /*
         * 创建面板，以达到良好的布局
         */
        JPanel panel = new JPanel();// JPanel：面板组件，非顶层容器
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        JPanel panel4 = new JPanel();
        JPanel panel5 = new JPanel();
        panel.setOpaque(false);
        panel1.setOpaque(false);
        panel2.setOpaque(false);
        panel3.setOpaque(false);
        panel4.setOpaque(false);
        panel5.setOpaque(false);
        //标题
        JLabel labTitle = new JLabel("运动会");//设置窗口标题
        Font font1 = new Font("宋体", Font.BOLD, 50);//设置字形，字体和字号
        labTitle.setFont(font1);
        panel1.add(labTitle);
        panel1.setBounds(260, 50, 300, 80);//设置窗口位置和大小
        contentPane.add(panel1);

        /*
         * 设置身份标签
         */
        Font font = new Font("宋体", Font.BOLD, 20);
        JLabel labCard = new JLabel("身份:  ");// 用标签来表示文本或图片
        labCard.setFont(font);// 设置标签字体的大小
        panel.add(labCard);// 将lable标签添加到面板上

        //下拉框   : 组合按钮 ；comboBox

        Dimension dim = new Dimension(200, 35);//设置组件的宽和高
        jcomboBox.setPreferredSize(dim);

        jcomboBox.addItem("运动员");
        jcomboBox.addItem("裁判员");
        jcomboBox.addItem("管理员账户");
        jcomboBox.setFont(font);
        panel.add(jcomboBox);
        panel.setBounds(250, 150, 300, 50);
        contentPane.add(panel);

        /*
         * /* 创建一个账号标签，并设置字体以及字体大小
         */
        JLabel labName = new JLabel("用户名:");// 用标签来表示文本或图片
        labName.setFont(font);// 设置标签字体的大小

        //JTextField textName = new JTextField();
        textName.setFont(font);
        textName.setPreferredSize(dim);
        panel2.add(labName);
        panel2.add(textName);
        panel2.setBounds(250, 200, 300, 50);// 设置面板的位置和大小
        contentPane.add(panel2);// 添加面板到窗口中
        /*
         * 创建一个密码标签
         */
        JLabel labPass = new JLabel("密码:  ");
        labPass.setFont(font);
        panel3.add(labPass);
        /*
         * 设置密码文本框
         */
        // JPasswordField textPass = new JPasswordField();
        textPass.setFont(font);
        textPass.setPreferredSize(dim);
        panel3.add(textPass);
        panel3.setBounds(250, 250, 300, 50);
        contentPane.add(panel3);

        /*
         * 设置一个按钮
         */
        Dimension dim1 = new Dimension(80, 30);

        jb1.addMouseListener(new ButtonMouseAction(jb1));
        jb2.addMouseListener(new ButtonMouseAction(jb2));
        jb1.addActionListener(this);
        jb2.addActionListener(this);
        jb1.setFont(font);
        jb2.setFont(font);
        jb1.setPreferredSize(dim1);
        jb2.setPreferredSize(dim1);
        panel4.add(jb1);
        panel5.add(jb2);
        panel4.setBounds(325, 310, 80, 50);
        panel5.setBounds(445, 310, 80, 50);
        contentPane.add(panel4);
        contentPane.add(panel5);

        ImageIcon imageIcon = new ImageIcon("src/imag/logo.jpg");
        Image image = imageIcon.getImage();
        jf.setIconImage(image);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setVisible(true);// 显示窗口
    }

    public static void main(String[] args) {
        //界面样式
        new LoginView();
    }

    /**
     * 登录和注册验证
     * 1、管理登录
     * 2、运动员登录
     * 3、注册行为
     *
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {

        UserDaoImpl userDao = new UserDaoImpl();
        //一、登录的实现步骤：
        // 获取用户名、密码
        // 登录的人员类型
        // 去对应的类型数据库表中进行验证
        //      1.用用户名进行查询
        //           -用户名存在 -> 对密码进行验证 ——》验证通过 跳转页面   不通过则弹出消息框
        //           -用户名不存在  -》 弹出消息框
        //===================================================================
        String password = String.valueOf(textPass.getPassword());  //密码
        String name = textName.getText();    //用户名
        String selectItemName = jcomboBox.getSelectedItem().toString();  // 登录人员类型
        System.out.println("用户名:" + name + "密码：" + password);
        System.out.println("登录类型" + jcomboBox.getSelectedItem().toString());
        User user = userDao.select(null, name);
        if (!name.equals("") && !password.equals("")) {  //输入的账号密码不为空
            System.out.println();
            if (e.getActionCommand().equals("登录")) {
                //如果是运动员登录：
                if (selectItemName.equals("运动员")) {

                    String userPassword = user.getPassword();
                    if (user.getUsername() != null) {   //查询结果是否存在
                        //用户的ID  和运动员ID是相同的
                        AthleteDaoImpl athleteDao = new AthleteDaoImpl();
                        Athlete athlete = athleteDao.select(user.getId());
                        if (athlete != null) {
                            Athlete.myA_id = athlete.getA_id();
                            Athlete.myC_id = athlete.getC_id();
                            Athlete.myAge = athlete.getAge();
                            Athlete.myDepartment = athlete.getDepartment();
                            Athlete.myName = athlete.getName();
                            Athlete.mySex = athlete.getSex();
                        }


                        if (userPassword.equals(password)) {
                            JLabel jLabel = new JLabel("登录成功");
                            jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                            ImageIcon imageIcon = new ImageIcon("src/imag/logo.jpg");
                            imageIcon.setImage(imageIcon.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT));
                            JOptionPane.showMessageDialog(null, jLabel, "success", JOptionPane.OK_OPTION, imageIcon);
                            jf.setVisible(false);
                            new AthleteView();

                        } else {
                            JLabel jLabel = new JLabel("密码不正确");
                            jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                            JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
                        }
                    } else {
                        JLabel jLabel = new JLabel("用户不存在");
                        jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                        JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);

                    }
                    //如果是管理员登录
                } else if (selectItemName.equals("管理员账户")) {
                    //根据账号密码查询数据库
                    AdminDaoImpl adminDao = new AdminDaoImpl();
                    Admin admin = adminDao.select(name);
                    if (admin.getName() != null) {   //查询管理员账号是否存在，存在则进行密码验证。
                        if (admin.getPassword().equals(password)) {
                            //跳转页面
                            Admin.myName = name;
                            Admin.myPassword = password;
                            JLabel jLabel = new JLabel("登录成功");
                            jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                            JOptionPane.showMessageDialog(null, jLabel, "成功", JOptionPane.INFORMATION_MESSAGE);
                            jf.setVisible(false);
                            new AdminView();
                        } else {
                            JLabel jLabel = new JLabel("密码不正确");
                            jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                            JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
                        }
                    } else {
                        JLabel jLabel = new JLabel("用户不存在");
                        jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                        JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
                    }

                } else if (selectItemName.equals("裁判员")) {
                    JLabel jLabel = new JLabel("裁判的功能界面尚未实现");
                    jLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
                    JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
                }
            } else if (e.getActionCommand().equals("注册")) {
                //1、验证注册的用户是否存在：
                //     2、 不存在时： 1、写入数据库user和athlete中   2、保存当前用户信息到 Athlete中
                //     3、 存在时：  弹出信息框提示

                //当注册的用户名是空 的  才能进行下一步注册  ,不是空的则弹出消息框提示用户存在
                if (selectItemName.equals("管理员账户")) {
                    JLabel jLabel = new JLabel("管理员账户不允许注册，只能通过特殊途径发放");
                    jLabel.setFont(new Font("宋体", Font.BOLD, 24));
                    JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
                } else {
                    if (user.getUsername() == null) {
                        User userNew = new User();
                        String uuid = UUID.randomUUID().toString();
                        userNew.setUsername(name);
                        userNew.setPassword(password);
                        userNew.setId(uuid);
                        userDao.add(userNew);
                        AthleteDaoImpl athleteDao = new AthleteDaoImpl();
                        Athlete athlete = new Athlete();
                        athlete.setA_id(uuid);
                        athlete.setName(name);
                        athleteDao.add(athlete);
                        Athlete.myName = name;
                        Athlete.myA_id = uuid;
                        User.myName = name;
                        User.myid = uuid;
                        JLabel jLabel = new JLabel("注册成功");
                        jLabel.setFont(new Font("宋体", Font.BOLD, 24));
                        ImageIcon imageIcon = new ImageIcon("src/imag/logo.jpg");
                        imageIcon.setImage(imageIcon.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT));
                        JOptionPane.showMessageDialog(null, jLabel, "success", JOptionPane.OK_OPTION, imageIcon);
                        jf.setVisible(false);
                        new AthleteView();
                    } else {
                        JLabel jLabel = new JLabel("用户名已存在");
                        jLabel.setFont(new Font("宋体", Font.BOLD, 24));
                        JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        } else {
            JLabel jLabel = new JLabel("账号和密码不能为空");
            jLabel.setFont(new Font("宋体", Font.BOLD, 24));
            JOptionPane.showMessageDialog(null, jLabel, "错误", JOptionPane.ERROR_MESSAGE);
        }


    }

    /**
     * 鼠标进入按钮时改变背景颜色
     */
    class ButtonMouseAction extends MouseAdapter {
        JButton but;  //需要发生动作的组件对象

        @Override
        public void mouseEntered(MouseEvent e) {
            but.setBackground(Color.cyan);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            but.setBackground(null);
        }

        ButtonMouseAction(JButton button) {
            this.but = button;
        }
    }
}